package com.yuanshen.equip.dto;


import cn.hutool.core.collection.CollectionUtil;
import com.yuanshen.equip.enums.Hero;
import com.yuanshen.equip.enums.PropertyType;

import java.util.ArrayList;
import java.util.List;

/**
 * 英雄有效词条
 *
 * @author Administrator
 * @date 2023/2/9 15:41
 */
public class HeroValidProperty {

    /**
     * 获取英雄有效词条
     *
     * @param hero 英雄
     * @return {@link List}<{@link PropertyType}>
     */
    public static List<PropertyType> getHeroProperty(Hero hero) {
        List<PropertyType> result;

        // 诺艾尔 圣遗物有效词条：防御力、充能、暴击率、暴击伤害
        // 凝光  圣遗物有效词条：攻击力、暴击率、暴击伤害
        // 钟离  辅助：生命值、充能  副c：生命值、攻击力、充能、暴击率、暴击伤害 主C：攻击力、暴击率、暴击伤害
        // 阿贝多 圣遗物有效词条：防御力、暴击率、暴击伤害。
        // 荒泷一斗 圣遗物有效词条：防御力、充能、攻击力、暴击率、暴击伤害。
        // 五郎  圣遗物有效词条：防御力、充能。
        // 云堇  圣遗物有效词条：防御力、充能。
        result = getHeroPropertyForYan(hero);
        if (CollectionUtil.isNotEmpty(result)) {
            return result;
        }


        // 迪卢克  圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        // 胡桃    圣遗物有效词条：生命值、攻击力(按生命值的60%计算)、精通、暴击率、暴击伤害
        // 可莉    圣遗物有效词条：攻击力、精通(纯火队则无此词条)、暴击率、暴击伤害。
        // 香菱    圣遗物有效词条：充能、精通、攻击力、暴击率、暴击伤害。
        // 班尼特  圣遗物有效词条：充能、生命值。
        // 烟绯    圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        // 安柏    圣遗物有效词条：攻击力、精通(不打反应则无此条)、暴击率、暴击伤害。
        // 辛焱    1.辅助：防御力、充能。 2.主c：攻击力、暴击率、暴击伤害。
        // 宵宫    圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        // 托马    1.盾辅：充能、生命值。 2.烈绽放：充能、精通、生命值。
        result = getHeroPropertyForHuo(hero);
        if (CollectionUtil.isNotEmpty(result)) {
            return result;
        }


        // 达达利亚  圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        // 行秋     圣遗物有效词条：充能、精通、攻击力、暴击率、暴击伤害。
        // 莫娜     圣遗物有效词条：充能、攻击力、精通(非水火反应队则为无效词条)、暴击率、暴击伤害。
        // 芭芭拉   圣遗物有效词条：充能、生命值。
        // 珊瑚宫心海  圣遗物有效词条：生命值、充能、攻击力。
        // 神里绫人    圣遗物有效词条：生命值、攻击力、暴击率、暴击伤害。
        // 夜兰     圣遗物有效词条：生命值、充能、暴击率、暴击伤害。
        // 妮露     圣遗物有效词条：精通、生命值。
        // 坎蒂丝   圣遗物有效词条：充能、生命值。
        result = getHeroPropertyForShui(hero);
        if (CollectionUtil.isNotEmpty(result)) {
            return result;
        }


        // 甘雨   圣遗物有效词条：攻击力、精通(永冻流则无此词条)、暴击率、暴击伤害。
        // 七七   圣遗物有效词条：充能，攻击力。
        // 神里绫华   圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        // 重云     圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        // 罗莎莉亚   圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        // 凯亚      圣遗物有效词条：攻击力、暴击率、暴击伤害。
        // 优菈      圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        // 迪奥娜    圣遗物有效词条：充能、生命值。
        // 埃洛伊    圣遗物有效词条：攻击力、精通(非反应队则为无效词条)、暴击率、暴击伤害。
        // 申鹤      圣遗物有效词条：充能、攻击力。
        // 莱依拉    圣遗物有效词条：生命，充能。
        result = getHeroPropertyForBing(hero);
        if (CollectionUtil.isNotEmpty(result)) {
            return result;
        }

        // 温迪   圣遗物有效词条：充能、攻击力、精通、暴击率、暴击伤害。
        // 琴    圣遗物有效词条：充能、攻击力、精通、暴击率、暴击伤害。
        // 砂糖  圣遗物有效词条：充能、精通。
        // 枫原万叶  圣遗物有效词条：精通、充能。
        // 魈    圣遗物有效词条：攻击力、暴击率、暴击伤害。
        // 早柚  圣遗物有效词条：充能、精通、攻击力。
        // 鹿野院平藏  圣遗物有效词条：攻击力、暴击率、暴击伤害、精通。
        // 流浪者  圣遗物有效词条：攻击力、暴击率、暴击伤害。
        // 珐露珊  圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        result = getHeroPropertyForFeng(hero);
        if (CollectionUtil.isNotEmpty(result)) {
            return result;
        }

        // 刻晴   圣遗物有效词条：精通(非激化队则无此词条)、攻击力、暴击率、暴击伤害。
        // 雷泽   圣遗物有效词条：攻击力、暴击率、暴击伤害。
        // 北斗   圣遗物有效词条：充能、精通(非激化队则无此词条)、攻击力、暴击率、暴击伤害。
        // 丽莎   圣遗物有效词条：充能、攻击力、精通、暴击率、暴击伤害。
        // 菲谢尔  圣遗物有效词条：精通(非激化队则无此词条)、攻击力、暴击率、暴击伤害。
        // 雷电将军  圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        // 九条裟罗  圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        // 八重神子  圣遗物有效词条：充能、精通、攻击力、暴击率、暴击伤害。
        // 久岐忍 圣遗物有效词条：精通、生命值。
        // 多莉   圣遗物有效词条：充能、生命值。
        // 赛诺   圣遗物有效词条：精通、攻击力、暴击率、暴击伤害。
        result = getHeroPropertyForLei(hero);
        if (CollectionUtil.isNotEmpty(result)) {
            return result;
        }

        return result;
    }

    /**
     * 获得岩系英雄的有效词条
     *
     * @param hero 英雄
     * @return {@link List}<{@link PropertyType}>
     */
    static List<PropertyType> getHeroPropertyForYan(Hero hero) {
        List<PropertyType> list = new ArrayList<>();

        // 诺艾尔 圣遗物有效词条：防御力、充能、暴击率、暴击伤害
        // 凝光  圣遗物有效词条：攻击力、暴击率、暴击伤害
        // 钟离  辅助：生命值、充能  副c：生命值、攻击力、充能、暴击率、暴击伤害 主C：攻击力、暴击率、暴击伤害
        // 阿贝多 圣遗物有效词条：防御力、暴击率、暴击伤害。
        // 荒泷一斗 圣遗物有效词条：防御力、充能、攻击力、暴击率、暴击伤害。
        // 五郎  圣遗物有效词条：防御力、充能。
        // 云堇  圣遗物有效词条：防御力、充能。

        // 诺艾尔 圣遗物有效词条：防御力、充能、暴击率、暴击伤害
        if (Hero.Noelle.equal(hero)) {
            list.add(PropertyType.DEFENSE);
            list.add(PropertyType.PERCENTAGE_OF_DEFENSE);
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 凝光  圣遗物有效词条：攻击力、暴击率、暴击伤害
        if (Hero.Ningguang.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 钟离  主C：攻击力、暴击率、暴击伤害
        if (Hero.Zhongli.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 阿贝多 圣遗物有效词条：防御力、暴击率、暴击伤害。
        if (Hero.Albedo.equal(hero)) {
            list.add(PropertyType.DEFENSE);
            list.add(PropertyType.PERCENTAGE_OF_DEFENSE);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 荒泷一斗 圣遗物有效词条：防御力、充能、攻击力、暴击率、暴击伤害。
        if (Hero.Arataki_Itto.equal(hero)) {
            list.add(PropertyType.DEFENSE);
            list.add(PropertyType.PERCENTAGE_OF_DEFENSE);
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 五郎  圣遗物有效词条：防御力、充能。
        if (Hero.Arataki_Itto.equal(hero)) {
            list.add(PropertyType.DEFENSE);
            list.add(PropertyType.PERCENTAGE_OF_DEFENSE);
            list.add(PropertyType.ELEMENT_CHARGE);
            return list;
        }

        // 云堇  圣遗物有效词条：防御力、充能。
        if (Hero.Arataki_Itto.equal(hero)) {
            list.add(PropertyType.DEFENSE);
            list.add(PropertyType.PERCENTAGE_OF_DEFENSE);
            list.add(PropertyType.ELEMENT_CHARGE);
            return list;
        }


        return list;
    }

    /**
     * 获得火系英雄的有效词条
     *
     * @param hero 英雄
     * @return {@link List}<{@link PropertyType}>
     */
    static List<PropertyType> getHeroPropertyForHuo(Hero hero) {
        // 迪卢克  圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        // 胡桃    圣遗物有效词条：生命值、攻击力(按生命值的60%计算)、精通、暴击率、暴击伤害
        // 可莉    圣遗物有效词条：攻击力、精通(纯火队则无此词条)、暴击率、暴击伤害。
        // 香菱    圣遗物有效词条：充能、精通、攻击力、暴击率、暴击伤害。
        // 班尼特  圣遗物有效词条：充能、生命值。
        // 烟绯    圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        // 安柏    圣遗物有效词条：攻击力、精通(不打反应则无此条)、暴击率、暴击伤害。
        // 辛焱    1.辅助：防御力、充能。 2.主c：攻击力、暴击率、暴击伤害。
        // 宵宫    圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        // 托马    1.盾辅：充能、生命值。 2.烈绽放：充能、精通、生命值。


        List<PropertyType> list = new ArrayList<>();
        // 迪卢克  圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        if (Hero.Arataki_Itto.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 胡桃    圣遗物有效词条：生命值、攻击力(按生命值的60%计算)、精通、暴击率、暴击伤害
        if (Hero.HuTao.equal(hero)) {
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 可莉    圣遗物有效词条：攻击力、精通(纯火队则无此词条)、暴击率、暴击伤害。
        if (Hero.Klee.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 香菱    圣遗物有效词条：充能、精通、攻击力、暴击率、暴击伤害。
        if (Hero.Xiangling.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 班尼特  圣遗物有效词条：充能、生命值。
        if (Hero.Bennett.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            return list;
        }

        // 烟绯    圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        if (Hero.Yanfei.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 安柏    圣遗物有效词条：攻击力、精通(不打反应则无此条)、暴击率、暴击伤害。
        if (Hero.Amber.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 辛焱    1.辅助：防御力、充能。
        if (Hero.Xinyan.equal(hero)) {
            list.add(PropertyType.DEFENSE);
            list.add(PropertyType.PERCENTAGE_OF_DEFENSE);
            list.add(PropertyType.ELEMENT_CHARGE);
            return list;
        }

        // 宵宫    圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        if (Hero.Yoimiya.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 托马    1.盾辅：充能、生命值。
        if (Hero.Thoma.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            return list;
        }


        return list;
    }


    /**
     * 获得水系英雄的有效词条
     *
     * @param hero 英雄
     * @return {@link List}<{@link PropertyType}>
     */
    static List<PropertyType> getHeroPropertyForShui(Hero hero) {
        // 达达利亚  圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        // 行秋     圣遗物有效词条：充能、精通、攻击力、暴击率、暴击伤害。
        // 莫娜     圣遗物有效词条：充能、攻击力、精通(非水火反应队则为无效词条)、暴击率、暴击伤害。
        // 芭芭拉   圣遗物有效词条：充能、生命值。
        // 珊瑚宫心海  圣遗物有效词条：生命值、充能、攻击力。
        // 神里绫人    圣遗物有效词条：生命值、攻击力、暴击率、暴击伤害。
        // 夜兰     圣遗物有效词条：生命值、充能、暴击率、暴击伤害。
        // 妮露     圣遗物有效词条：精通、生命值。
        // 坎蒂丝   圣遗物有效词条：充能、生命值。


        // 达达利亚  圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        List<PropertyType> list = new ArrayList<>();
        if (Hero.Tartaglia.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 行秋     圣遗物有效词条：充能、精通、攻击力、暴击率、暴击伤害。
        if (Hero.Xingqiu.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 莫娜     圣遗物有效词条：充能、攻击力、精通(非水火反应队则为无效词条)、暴击率、暴击伤害。
        if (Hero.Mona.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 芭芭拉   圣遗物有效词条：充能、生命值。
        if (Hero.Barbara.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            return list;
        }

        // 珊瑚宫心海  圣遗物有效词条：生命值、充能、攻击力。
        if (Hero.Sangonomiya_Kokomi.equal(hero)) {
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            return list;
        }

        // 神里绫人    圣遗物有效词条：生命值、攻击力、暴击率、暴击伤害。
        if (Hero.Kamizato_Ayaka.equal(hero)) {
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }


        // 夜兰     圣遗物有效词条：生命值、充能、暴击率、暴击伤害。
        if (Hero.YeLan.equal(hero)) {
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 妮露     圣遗物有效词条：精通、生命值。
        if (Hero.Nilou.equal(hero)) {
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            return list;
        }

        // 坎蒂丝   圣遗物有效词条：充能、生命值。
        if (Hero.Candace.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            return list;
        }

        return list;
    }

    /**
     * 获得冰系英雄的有效词条
     *
     * @param hero 英雄
     * @return {@link List}<{@link PropertyType}>
     */
    static List<PropertyType> getHeroPropertyForBing(Hero hero) {
        // 甘雨   圣遗物有效词条：攻击力、精通(永冻流则无此词条)、暴击率、暴击伤害。
        // 七七   圣遗物有效词条：充能，攻击力。
        // 神里绫华   圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        // 重云     圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        // 罗莎莉亚   圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        // 凯亚      圣遗物有效词条：攻击力、暴击率、暴击伤害。
        // 优菈      圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        // 迪奥娜    圣遗物有效词条：充能、生命值。
        // 埃洛伊    圣遗物有效词条：攻击力、精通(非反应队则为无效词条)、暴击率、暴击伤害。
        // 申鹤      圣遗物有效词条：充能、攻击力。
        // 莱依拉    圣遗物有效词条：生命，充能。

        List<PropertyType> list = new ArrayList<>();
        // 甘雨   圣遗物有效词条：攻击力、精通(永冻流则无此词条)、暴击率、暴击伤害。
        if (Hero.Ganyu.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 七七   圣遗物有效词条：充能，攻击力。
        if (Hero.Qiqi.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            return list;
        }

        // 神里绫华   圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        if (Hero.Kamizato_Ayaka.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 重云     圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        if (Hero.Chongyun.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 罗莎莉亚   圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        if (Hero.Rosaria.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 凯亚      圣遗物有效词条：攻击力、暴击率、暴击伤害。
        if (Hero.Kaeya.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 优菈      圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        if (Hero.Eula.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 迪奥娜    圣遗物有效词条：充能、生命值。
        if (Hero.Diona.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            return list;
        }

        // 埃洛伊    圣遗物有效词条：攻击力、精通(非反应队则为无效词条)、暴击率、暴击伤害。
        if (Hero.Aloy.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 申鹤      圣遗物有效词条：充能、攻击力。
        if (Hero.Shenhe.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            return list;
        }

        // 莱依拉    圣遗物有效词条：生命，充能。
        if (Hero.Laiyila.equal(hero)) {
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            list.add(PropertyType.ELEMENT_CHARGE);
            return list;
        }

        return list;
    }

    /**
     * 获得风系英雄的有效词条
     *
     * @param hero 英雄
     * @return {@link List}<{@link PropertyType}>
     */
    static List<PropertyType> getHeroPropertyForFeng(Hero hero) {
        // 温迪   圣遗物有效词条：充能、攻击力、精通、暴击率、暴击伤害。
        // 琴    圣遗物有效词条：充能、攻击力、精通、暴击率、暴击伤害。
        // 砂糖  圣遗物有效词条：充能、精通。
        // 枫原万叶  圣遗物有效词条：精通、充能。
        // 魈    圣遗物有效词条：攻击力、暴击率、暴击伤害。
        // 早柚  圣遗物有效词条：充能、精通、攻击力。
        // 鹿野院平藏  圣遗物有效词条：攻击力、暴击率、暴击伤害、精通。
        // 流浪者  圣遗物有效词条：攻击力、暴击率、暴击伤害。
        // 珐露珊  圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。

        // 温迪   圣遗物有效词条：充能、攻击力、精通、暴击率、暴击伤害。
        List<PropertyType> list = new ArrayList<>();
        if (Hero.Venti.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 琴    圣遗物有效词条：充能、攻击力、精通、暴击率、暴击伤害。
        if (Hero.Jean.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 砂糖  圣遗物有效词条：充能、精通。
        if (Hero.Sucrose.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            return list;
        }

        // 枫原万叶  圣遗物有效词条：精通、充能。
        if (Hero.Kaedehara_Kazuha.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            return list;
        }

        // 魈    圣遗物有效词条：攻击力、暴击率、暴击伤害。
        if (Hero.Xiao.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 早柚  圣遗物有效词条：充能、精通、攻击力。
        if (Hero.Sayu.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            return list;
        }

        // 鹿野院平藏  圣遗物有效词条：攻击力、精通、暴击率、暴击伤害。
        if (Hero.Pingzang.equal(hero)) {
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 流浪者  圣遗物有效词条：攻击力、暴击率、暴击伤害。
        if (Hero.Wanderer.equal(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 珐露珊  圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        if (Hero.Falushan.equal(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }
        return list;
    }

    /**
     * 获得雷系英雄的有效词条
     *
     * @param hero 英雄
     * @return {@link List}<{@link PropertyType}>
     */
    static List<PropertyType> getHeroPropertyForLei(Hero hero) {
        // 刻晴   圣遗物有效词条：精通(非激化队则无此词条)、攻击力、暴击率、暴击伤害。
        // 雷泽   圣遗物有效词条：攻击力、暴击率、暴击伤害。
        // 北斗   圣遗物有效词条：充能、精通(非激化队则无此词条)、攻击力、暴击率、暴击伤害。
        // 丽莎   圣遗物有效词条：充能、攻击力、精通、暴击率、暴击伤害。
        // 菲谢尔  圣遗物有效词条：精通(非激化队则无此词条)、攻击力、暴击率、暴击伤害。
        // 雷电将军  圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        // 九条裟罗  圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        // 八重神子  圣遗物有效词条：充能、精通、攻击力、暴击率、暴击伤害。
        // 久岐忍 圣遗物有效词条：精通、生命值。
        // 多莉   圣遗物有效词条：充能、生命值。
        // 赛诺   圣遗物有效词条：精通、攻击力、暴击率、暴击伤害。

        // 刻晴   圣遗物有效词条：精通(非激化队则无此词条)、攻击力、暴击率、暴击伤害。
        List<PropertyType> list = new ArrayList<>();
        if (Hero.Keqing.equals(hero)) {
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 雷泽   圣遗物有效词条：攻击力、暴击率、暴击伤害。
        if (Hero.Razor.equals(hero)) {
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 北斗   圣遗物有效词条：充能、精通(非激化队则无此词条)、攻击力、暴击率、暴击伤害。
        if (Hero.Beidou.equals(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.RAY_ELEMENT_DAMAGE_UP);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 丽莎   圣遗物有效词条：充能、攻击力、精通、暴击率、暴击伤害。
        if (Hero.Lisa.equals(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 菲谢尔  圣遗物有效词条：精通(非激化队则无此词条)、攻击力、暴击率、暴击伤害。
        if (Hero.Fischl.equals(hero)) {
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 雷电将军有效词条：充能、攻击力、暴击、爆伤
        if (Hero.Raiden_Shogun.equals(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.RAY_ELEMENT_DAMAGE_UP);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 九条裟罗  圣遗物有效词条：充能、攻击力、暴击率、暴击伤害。
        if (Hero.Kujo_Sara.equals(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.RAY_ELEMENT_DAMAGE_UP);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 八重神子  圣遗物有效词条：充能、精通、攻击力、暴击率、暴击伤害。
        if (Hero.Yae_Miko.equals(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }

        // 久岐忍 圣遗物有效词条：精通、生命值。
        if (Hero.Kuki_Shinobu.equals(hero)) {
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            return list;
        }

        // 多莉   圣遗物有效词条：充能、生命值。
        if (Hero.Dori.equals(hero)) {
            list.add(PropertyType.ELEMENT_CHARGE);
            list.add(PropertyType.HP);
            list.add(PropertyType.PERCENTAGE_OF_HP);
            return list;
        }

        // 赛诺   圣遗物有效词条：精通、攻击力、暴击率、暴击伤害。
        if (Hero.Cyno.equals(hero)) {
            list.add(PropertyType.ELEMENT_PROFICIENT);
            list.add(PropertyType.ATTACK_POWER);
            list.add(PropertyType.PERCENTAGE_OF_ATTACK_POWER);
            list.add(PropertyType.CRITICAL_STRIKE_RATE);
            list.add(PropertyType.CRITICAL_DAMAGE);
            return list;
        }


        return list;
    }

    /**
     * 计算有效词条数
     *
     * @param hero          英雄
     * @param propertyTypes 属性类型
     * @return int
     */
    public static int calValidNumber(Hero hero, List<PropertyType> propertyTypes) {
        int result = 0;
        List<PropertyType> heroProperty = HeroValidProperty.getHeroProperty(hero);

        // 未有有效词条，直接返回0
        if (CollectionUtil.isEmpty(heroProperty)) {
            return 0;
        }

        for (PropertyType item : propertyTypes) {
            if (heroProperty.contains(item)) {
                result++;
            }
        }

        return result;
    }
}
